package string;

public class StringDemo {
    public static void main(String[] args) {
        /**
         使用字面量（""）来创建字符串对象时，JVM会检查常量池中是否有该对象
         1）若没有，则会创建字符串对象，并将其引用存入常量池中
         2）若有的话，直接将常量池中的对象（引用）返回，并不会创建新的字符串对象
         */
        /*String  s1 = "123abc";//常量池还没有，因此创建该字符串对象，并存入常量池中
        String  s2 = "123abc";//常量池中有了，直接引用
        String  s3 = "123abc";//常量池中有了，直接引用
        //引用类型==  比较的是地址是否相同 -----规定
        System.out.println(s1==s2);//true
        System.out.println(s1==s3);//true
        System.out.println(s2==s3);//true

        s1 = s1+"!";//创建新的字符串对象（123abc!）,并将地址赋值给s1
        System.out.println(s1==s2);//false*/

        /*String s1 = "123abc";//堆中创建123ABC字符量对象，并缓存到常量池中
        //编译时在编译时，若发现是两个字面量相连，则会直接连接好并将结果保存起来
        //如下语句会被编译为:String s2 = "123abc";
        String s2 = "123"+"abc";
        System.out.println(s1==s2);//true

        String s3 = "123";
        //因为s3是一个变量，所以在编译期并不会直接编译好
        String s4 = s3+"abc";//创建一个新的对象存储123abc
        System.out.println(s4);//123abc
        System.out.println(s1==s4);//false*/


        /**面试题：
         1.
         String s = new String("hello");
         问：如上语句创建了几个对象；
         答：2个
            第一个：字面量“hello”
            ----java会创建一个String字面量"hello",并将其存入常量池中
            第二个：new String()
            ----new String()时会创建一个

         */
        String s =new String("hello");//创建了2个对象
        String s1 = "hello";//复用常量池中的字面量对象地址
        System.out.println(s==s1);//false, == 比较的是地址是否相同


        //在实际应用中，String比较相等一般都是比较字符串的内容是否相同
        //因此我们需要使用equals()方法来比较两个字符串是否相同
        System.out.println(s.equals(s1));//true,equals()比较的是内容是否相同---必须掌握
        /**s调用equals时String重写了equals*/

    }
}
